#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e5 + 10;
const int p=998244353;
int q[maxn], mx[maxn], mn[maxn], h[maxn];

int qmi(int a, int b){
	int res=1;
	while(b){
		if(b&1){
			res=res*a%p;
		}
		a=a*a%p;
		b>>=1;
	}
	return res;
}

// 逆元
int inv(int x){
	return qmi(x, p-2);
}

int n, k, x;
void solve(){
	cin>>n>>k>>x;
	for(int i=1;i<=n;i++){
		cin>>h[i];
	}
	int head=1, tail=0;
	
	// 先求出固定区间长度的 最大值
	for(int i=1;i<=n;i++){
		while(head<=tail&&(i-q[head]+1)>k) {// 将超出k 个范围的弹出来
			head++;
		}
		while(head<=tail&&h[q[tail]]<=h[i]){ // 注意这里面是 head<=tail 而不是tail , 因为 head 和 tail 一直都在移动
			tail--;
		}
		q[++tail]=i;
		mx[i]=h[q[head]];
	}
	
	// 再求出固定区间长度的最小值
	head=1, tail=0;
	for(int i=1;i<=n;i++){
		while(head<=tail&&(i-q[head]+1)>k){
			head++; // 弹出多余的
		}
		while(head<=tail&&h[q[tail]]>=h[i]){ // 注意这里面是 head<=tail 而不是tail , 因为 head 和 tail 一直都在移动
			tail--;
		}
		q[++tail]=i;
		mn[i]=h[q[head]];
	}
	
	int cnt=0;
	for(int i=k;i<=n;i++){
		if(mx[i]-mn[i]<=x){
			cnt++;
		}
	}
	cout<<cnt*inv(n-k+1)%p<<'\n';
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
